﻿using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using DevExpress.XtraReports.UI;
using System.Data;

namespace Tailord.Reports
{
    public partial class xrFatura2016 : DevExpress.XtraReports.UI.XtraReport
    {
        DataSet ds;
        int FaturaRowCount;
        int beforePrintCount = 0;
        int pageIndex = 1;
        int nextCalculate = 5;
        int pageCount;

        public xrFatura2016(DataSet ds)
        {
            InitializeComponent();

            ShowPrintMarginsWarning = false;

            this.ds = ds;

            xrSubFatura2016 subIrsaliye = (xrSubFatura2016)subIrsaliyeLines.ReportSource;
            subIrsaliye.fillTable(ds.Tables["Table1"]);

            subIrsaliye = (xrSubFatura2016)subIrsaliyeLines2.ReportSource;
            subIrsaliye.fillTable(ds.Tables["Table1"]);

            subIrsaliye = (xrSubFatura2016)subIrsaliyeLines3.ReportSource;
            subIrsaliye.fillTable(ds.Tables["Table1"]);

            subIrsaliye = (xrSubFatura2016)subIrsaliyeLines4.ReportSource;
            subIrsaliye.fillTable(ds.Tables["Table1"]);

            FaturaRowCount = ds.Tables["Table1"].Rows.Count;
            int mod = FaturaRowCount % 14 == 0 ? 0 : 1;
            pageCount = FaturaRowCount / 14 + mod;

            this.DataMember = "Table";
            this.DataSource = ds;

            XRTable[] tbarray = new XRTable[] { tbFirma, tbFiyat, tbTarih, tbVD, tbIskonto, tbKDV, tbFirma2, tbFiyat2, tbTarih2, tbVD2, tbIskonto2, tbKDV2, tbFirma3, tbFiyat3, tbTarih3, tbVD3, tbIskonto3, tbKDV3, tbFirma4, tbFiyat4, tbTarih4, tbVD4, tbIskonto4, tbKDV4 };

            foreach (XRTable table in tbarray)
            {
                foreach (XRTableRow row in table.Rows)
                {
                    foreach (XRTableCell cell in row)
                    {
                        if (cell.Name.StartsWith("tc"))
                            if (FaturaRowCount > 14 && (cell.Name.Contains("tcIskontoTutari") || cell.Name.Contains("tcToplamFiyat") || cell.Name.Contains("tcKDVTutar") || cell.Name.Contains("tcGenelToplam")))
                                continue;
                            else
                                cell.DataBindings.Add("Text", null, "Table." + cell.Name.Substring(0,cell.Name.Length-1));
                    }
                }
            }
            
            decimal val = -1;
            decimal.TryParse(ds.Tables["Table"].Rows[0]["GenelToplam"].ToString(), out val);
            string dvzCinsi = ds.Tables["Table"].Rows[0]["DovizCinsi"].ToString();
            tcNetFiyatYazi1.Text = tcNetFiyatYazi2.Text = tcNetFiyatYazi3.Text = tcNetFiyatYazi4.Text = yaziyaCevir(val, dvzCinsi);

            tcAdres1.BeforePrint += ReSize;
            tcAdres2.BeforePrint += ReSize;
            tcAdres3.BeforePrint += ReSize;
            tcAdres4.BeforePrint += ReSize;

            tcUnvan1.BeforePrint += ReSize2;
            tcUnvan2.BeforePrint += ReSize2;
            tcUnvan3.BeforePrint += ReSize2;
            tcUnvan4.BeforePrint += ReSize2;
        }

        private void ReSize(object sender, System.Drawing.Printing.PrintEventArgs e)
        {
            //Resize ı düzgün yapan tek fonksiyon !!!
            Graphics gr = Graphics.FromHwnd(IntPtr.Zero);
            gr.PageUnit = GraphicsUnit.Millimeter;
            int factor = 10;

            XRLabel label = (XRLabel)sender;

            float newSize = 8f;
            Font defaultFont = new System.Drawing.Font("Calibri", newSize);

            float stringWidth = gr.MeasureString(label.Text, defaultFont).Width;
            float labelWidth = label.WidthF * 3;


            if (labelWidth < stringWidth * factor)
                newSize = defaultFont.Size * labelWidth / stringWidth / factor;


            label.Font = new Font(defaultFont.FontFamily, newSize);
            gr.Dispose();
        }

        private void ReSize2(object sender, System.Drawing.Printing.PrintEventArgs e)
        {
            //Resize ı düzgün yapan tek fonksiyon !!!
            Graphics gr = Graphics.FromHwnd(IntPtr.Zero);
            gr.PageUnit = GraphicsUnit.Millimeter;
            int factor = 10;

            XRLabel label = (XRLabel)sender;

            float newSize = 8f;
            Font defaultFont = new System.Drawing.Font("Calibri", newSize);

            float stringWidth = gr.MeasureString(label.Text, defaultFont).Width;
            float labelWidth = label.WidthF;


            if (labelWidth < stringWidth * factor)
                newSize = defaultFont.Size * label.Width / stringWidth / factor;


            label.Font = new Font(defaultFont.FontFamily, newSize);
            gr.Dispose();
        }

        private void CalculatePrice()
        {
            string dvzCinsi = ds.Tables["Table"].Rows[0]["DovizCinsi"].ToString();
            decimal toplamFiyat = 0;
            string selectString = "RN > " + ((pageIndex - 1) * 14).ToString() + " and RN <= " + ((pageIndex) * 14).ToString();
            foreach (DataRow dr in ds.Tables["Table1"].Select(selectString))
            {
                decimal val;
                decimal.TryParse(dr["tcTutar"].ToString(), out val);
                toplamFiyat += val;
            }
            decimal Iskonto;
            decimal.TryParse(ds.Tables[0].Rows[0]["Iskonto"].ToString(), out Iskonto);
            int KDV = (int)ds.Tables[0].Rows[0]["tcKDV"];
            decimal IskontoTutari = decimal.Round(toplamFiyat * Iskonto / 100, 2);
            decimal toplamFiyatIndirimli = decimal.Round(toplamFiyat - IskontoTutari, 2);

            tcKDVTutar1.Text = tcKDVTutar2.Text = tcKDVTutar3.Text = tcKDVTutar4.Text = decimal.Round(toplamFiyatIndirimli * KDV / 100, 2).ToString() + " " + dvzCinsi;
            tcIskontoTutari1.Text = tcIskontoTutari2.Text = tcIskontoTutari3.Text = tcIskontoTutari4.Text = IskontoTutari.ToString() + " " + dvzCinsi;
            tcToplamFiyat1.Text = tcToplamFiyat2.Text = tcToplamFiyat3.Text = tcToplamFiyat4.Text = toplamFiyatIndirimli.ToString() + " " + dvzCinsi;
            tcGenelToplam1.Text = tcGenelToplam2.Text = tcGenelToplam3.Text = tcGenelToplam4.Text = decimal.Round(toplamFiyatIndirimli + (toplamFiyatIndirimli * KDV / 100), 2).ToString() + " " + dvzCinsi;


            decimal genelToplam = decimal.Round(toplamFiyatIndirimli + (toplamFiyatIndirimli * KDV / 100), 2);
            tcNetFiyatYazi1.Text = tcNetFiyatYazi2.Text = tcNetFiyatYazi3.Text = tcNetFiyatYazi4.Text = yaziyaCevir(genelToplam, dvzCinsi);

            pageIndex++;
            nextCalculate = pageIndex == pageCount ? nextCalculate + 8 : nextCalculate + 3;
        }

        private string yaziyaCevir(decimal tutar, string dvz)
        {
            string sTutar = tutar.ToString("F2").Replace('.', ','); // Replace('.',',') ondalık ayracının . olma durumu için            
            string lira = sTutar.Substring(0, sTutar.IndexOf(',')); //tutarın tam kısmı
            string kurus = sTutar.Substring(sTutar.IndexOf(',') + 1, 2);
            string yazi = "";

            string[] birler = { "", "BİR", "İKİ", "ÜÇ", "DÖRT", "BEŞ", "ALTI", "YEDİ", "SEKİZ", "DOKUZ" };
            string[] onlar = { "", "ON", "YİRMİ", "OTUZ", "KIRK", "ELLİ", "ALTMIŞ", "YETMİŞ", "SEKSEN", "DOKSAN" };
            string[] binler = { "KATRİLYON", "TRİLYON", "MİLYAR", "MİLYON", "BİN", "" }; //KATRİLYON'un önüne ekleme yapılarak artırabilir.

            int grupSayisi = 6; //sayıdaki 3'lü grup sayısı. katrilyon içi 6. (1.234,00 daki grup sayısı 2'dir.)
            //KATRİLYON'un başına ekleyeceğiniz her değer için grup sayısını artırınız.

            lira = lira.PadLeft(grupSayisi * 3, '0'); //sayının soluna '0' eklenerek sayı 'grup sayısı x 3' basakmaklı yapılıyor.            

            string grupDegeri;

            for (int i = 0; i < grupSayisi * 3; i += 3) //sayı 3'erli gruplar halinde ele alınıyor.
            {
                grupDegeri = "";

                if (lira.Substring(i, 1) != "0")
                    grupDegeri += birler[Convert.ToInt32(lira.Substring(i, 1))] + "YÜZ"; //yüzler                

                if (grupDegeri == "BİRYÜZ") //biryüz düzeltiliyor.
                    grupDegeri = "YÜZ";

                grupDegeri += onlar[Convert.ToInt32(lira.Substring(i + 1, 1))]; //onlar

                grupDegeri += birler[Convert.ToInt32(lira.Substring(i + 2, 1))]; //birler                

                if (grupDegeri != "") //binler
                    grupDegeri += binler[i / 3];

                if (grupDegeri == "BİRBİN") //birbin düzeltiliyor.
                    grupDegeri = "BİN";

                yazi += grupDegeri;
            }

            if (yazi != "")
                yazi += " " + dvz + " ";

            int yaziUzunlugu = yazi.Length;

            if (kurus.Substring(0, 1) != "0") //kuruş onlar
                yazi += onlar[Convert.ToInt32(kurus.Substring(0, 1))];

            if (kurus.Substring(1, 1) != "0") //kuruş birler
                yazi += birler[Convert.ToInt32(kurus.Substring(1, 1))];

            if (yazi.Length > yaziUzunlugu)
                yazi += dvz != "TL" ? "" : " Kr.";
            else
                yazi += dvz != "TL" ? "" : " SIFIR Kr.";

            return yazi;
        }

        private void Detail_BeforePrint(object sender, System.Drawing.Printing.PrintEventArgs e)
        {
            this.DataMember = "Table";
            this.DataSource = ds;
        }

        private void tcIskontoTutari_BeforePrint(object sender, System.Drawing.Printing.PrintEventArgs e)
        {
            // TODO: PageIndex bu kodla yakalanıyor. Benim kurduğum yapının yerine bunu kullan
            //XtraReport rep = (XtraReport)((XRTableCell)sender).Report;
            //int a = rep.PrintingSystem.Document.PageCount;

            if (pageIndex <= pageCount)
                if (FaturaRowCount > 14)
                {
                    beforePrintCount += 1;
                    if (beforePrintCount == nextCalculate)
                    {
                        CalculatePrice();
                    }
                }
        }

    }
}
